import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

// 创建一个axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API || '/dev-api',  // 接口的基础路径
  timeout: 5000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在请求发送前做一些处理
    // 添加token到请求头
    if (store.getters.token) {
      // 如果有token就在请求头中加上token
      config.headers['token'] = getToken()
    }
    
    // 文件上传请求需要更长的超时时间
    const isUploadRequest = config.url && (
      config.url.includes('/upload') || 
      config.url.includes('/file')
    ) || config.data instanceof FormData
    
    if (isUploadRequest) {
      // 文件上传请求设置为 60 秒超时
      config.timeout = 60000
      console.log('📤 文件上传请求，设置超时时间为 60 秒:', config.url)
      
      // 如果是 FormData，确保不手动设置 Content-Type（让浏览器自动设置）
      if (config.data instanceof FormData && config.headers['Content-Type']) {
        delete config.headers['Content-Type']
        console.log('📤 移除手动设置的 Content-Type，让浏览器自动设置')
      }
    }
    
    return config
  },
  error => {
    // 对请求错误做些什么
    console.log(error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 对响应数据做一些处理，这里只返回响应数据中的data部分
    const res = response.data

    // 修改响应处理逻辑，支持Dify API的响应格式
    // Dify API 返回格式: { success: true/false, data: [...], error: "..." }
    if (res.success === false) {
      // Dify API 返回错误
      const errorMessage = res.error || res.message || 'API请求失败'
      console.error('API请求失败:', errorMessage)
      
      // 不显示通用错误消息，让组件自己处理
      return Promise.reject(new Error(errorMessage))
    } else if (res.code !== undefined && res.code !== 20000 && res.code !== 200) {
      // 传统格式的错误响应
      
      // 检查是否是未登录错误（401），需要重定向到登录页
      if (res.code === 401 || res.msg === '需要登录后操作' || res.message === '需要登录后操作') {
        // 用户未登录，强制重定向到登录页面
        console.warn('用户未登录，重定向到登录页面')
        store.dispatch('user/resetToken').then(() => {
          // 清除token后重定向到登录页
          window.location.href = '/login'
        })
        return Promise.reject(new Error('用户未登录'))
      }
      
      Message({
        message: res.message || res.msg || 'Error',
        type: 'error',
        duration: 5 * 1000
      })

      // 返回一个被拒绝的Promise对象，用来表示错误
      return Promise.reject(new Error(res.message || res.msg || 'Error'))
    } else {
      // 如果没有错误，就返回响应数据中的data部分
      return res
    }
  },
  error => {
    // 对响应错误做些什么
    console.error('请求错误:', error)
    console.error('错误详情:', {
      message: error.message,
      code: error.code,
      config: error.config ? {
        url: error.config.url,
        method: error.config.method,
        timeout: error.config.timeout,
        data: error.config.data instanceof FormData ? 'FormData' : error.config.data
      } : null,
      response: error.response ? {
        status: error.response.status,
        statusText: error.response.statusText,
        data: error.response.data
      } : null,
      request: error.request ? '请求已发送但未收到响应' : null
    })
    
    let errorMessage = '请求失败';
    
    if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {
      errorMessage = `请求超时（${error.config?.timeout || 5000}ms），请检查网络连接或后端服务是否启动`;
      console.error('⚠️ 请求超时，可能的原因：')
      console.error('  1. 后端服务未启动或无法访问')
      console.error('  2. 网络连接问题')
      console.error('  3. 文件太大，上传时间超过超时限制')
      console.error('  4. 代理配置问题')
    } else if (error.response) {
      // 服务器响应了错误状态码
      const status = error.response.status;
      if (status === 404) {
        errorMessage = '请求的资源不存在，请检查API路径';
      } else if (status === 500) {
        errorMessage = '服务器内部错误';
      } else if (status === 401) {
        errorMessage = '未授权访问，请先登录';
        // 401 未授权，强制重定向到登录页面
        console.warn('HTTP 401 未授权，重定向到登录页面')
        store.dispatch('user/resetToken').then(() => {
          // 清除token后重定向到登录页
          window.location.href = '/login'
        })
      } else if (status === 403) {
        errorMessage = '禁止访问';
      } else {
        errorMessage = `请求失败 (${status}): ${error.response.data?.message || error.message}`;
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      errorMessage = '无法连接到服务器，请检查后端服务是否启动';
    } else {
      // 其他错误
      errorMessage = error.message || '未知错误';
    }
    
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service